package com.liuyi.mybatisplus.plus.base;

import cn.hutool.core.lang.Dict;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * 自定义BaseMapper
 *
 * @param <T>
 */
public interface IBaseMapper<T> extends BaseMapper<T> {

    @Select("${sql}")
    Integer runSqlCount(@Param("sql") String sql);

    @Select("${sql}")
    Object runSqlObj(@Param("sql") String sql);

    @Select("${sql}")
    Map<String, Object> runSqlOne(@Param("sql") String sql);

    @Select("${sql}")
    List<Map<String, Object>> runSql(@Param("sql") String sql);

    /**
     * 有SQL注入风险、不支持Plus的全局默认逻辑删除
     *
     * @param table   表明，可以是多表连接
     * @param wrapper Wrapper
     */
    @Select("select ${ew.sqlSelect} from ${table} ${ew.customSqlSegment}")
    List<Dict> sql(@Param("table") String table, @Param(Constants.WRAPPER) Wrapper<?> wrapper);

    /**
     * 有SQL注入风险、不支持Plus的全局默认逻辑删除
     *
     * @param table   表明，可以是多表连接
     * @param wrapper Wrapper
     */
    @Select("select ${ew.sqlSelect} from ${table} ${ew.customSqlSegment}")
    Dict sqlOne(@Param("table") String table, @Param(Constants.WRAPPER) Wrapper<?> wrapper);

    /**
     * 有SQL注入风险、不支持Plus的全局默认逻辑删除
     *
     * @param table   表明，可以是多表连接
     * @param wrapper Wrapper
     */
    @Select("select ${ew.sqlSelect} from ${table} ${ew.customSqlSegment}")
    Integer sqlCount(@Param("table") String table, @Param(Constants.WRAPPER) Wrapper<?> wrapper);

    /**
     * 有SQL注入风险、不支持Plus的全局默认逻辑删除
     *
     * @param table   表明，可以是多表连接
     * @param wrapper Wrapper
     */
    @Select("select ${ew.sqlSelect} from ${table} ${ew.customSqlSegment}")
    Object sqlLine(@Param("table") String table, @Param(Constants.WRAPPER) Wrapper<?> wrapper);
}
